package cn.iocoder.yudao.module.wms.dal.redis.serialNumber;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.iocoder.yudao.module.wms.dal.redis.RedisKeyConstants;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.time.Duration;
import java.time.LocalDateTime;

/**
 * @Author: zengjs
 * @Description: WMS流水号的RedisDAO
 * @DateTime: 2024/11/7 15:36
 **/
@Repository
public class WmsSerialNumberRedisDAO {

    /**
     * 采购订单 {@link cn.iocoder.yudao.module.wms.dal.dataobject.pomain.PomainDO}
     */
    public static final String POMAIN_SERIAL_PREFIX = "CGDD";

    /**
     * 采购入库 {@link cn.iocoder.yudao.module.wms.dal.dataobject.rdrecord01.Rdrecord01DO}
     */
    public static final String RD01_SERIAL_PREFIX = "CGRK";

    /**
     * 调拨入库 {@link cn.iocoder.yudao.module.wms.dal.dataobject.rdrecord06.Rdrecord06DO}
     */
    public static final String RD06_SERIAL_PREFIX = "DBRK";

    /**
     * 调拨出库 {@link cn.iocoder.yudao.module.wms.dal.dataobject.rdrecord07.Rdrecord07DO}
     */
    public static final String RD07_SERIAL_PREFIX = "DBCK";

    /**
     * 其它入库 {@link cn.iocoder.yudao.module.wms.dal.dataobject.rdrecord08.Rdrecord08DO}
     */
    public static final String RD08_SERIAL_PREFIX = "QTRK";

    /**
     * 其它出库 {@link cn.iocoder.yudao.module.wms.dal.dataobject.rdrecord09.Rdrecord09DO}
     */
    public static final String RD09_SERIAL_PREFIX = "QTCK";

    /**
     * 生产入库 {@link cn.iocoder.yudao.module.wms.dal.dataobject.rdrecord10.Rdrecord10DO}
     */
    public static final String RD10_SERIAL_PREFIX = "SCRK";

    /**
     * 材料出库 {@link cn.iocoder.yudao.module.wms.dal.dataobject.rdrecord11.Rdrecord11DO}
     */
    public static final String RD11_SERIAL_PREFIX = "CLCK";

    /**
     * 销售出库 {@link cn.iocoder.yudao.module.wms.dal.dataobject.rdrecord32.Rdrecord32DO}
     */
    public static final String RD32_SERIAL_PREFIX = "XSCK";

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 生成序号，使用当前日期，格式为 {PREFIX} + yyyyMMdd + 6 位自增
     * 例如说：QTRK 202109 000001 （没有中间空格）
     *
     * @param prefix 前缀
     * @param serial 单据流水
     * @return 序号
     */
    public String generate(String prefix,String serial) {
        // 递增序号
        String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATE_PATTERN);
        String key = serial + noPrefix;
        Long no = stringRedisTemplate.opsForValue().increment(key);
        // 设置过期时间
        stringRedisTemplate.expire(key, Duration.ofDays(1L));
        return noPrefix + String.format("%06d", no);
    }

    /**
     * 生成批次，格式为 前缀 + 标识 + 流水长度
     * 例如说：QTRK 202109 000001 （没有中间空格）
     *
     * @param prefix 前缀
     * @param type 标识(目前默认:yyyyMMdd)
     * @param serialLength 流水长度
     * @return 序号
     */
    public String generate(String prefix,String type,Integer serialLength) {
        // 递增序号
        String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), type);
        String key = RedisKeyConstants.BATCH_SERIAL + noPrefix;
        Long no = stringRedisTemplate.opsForValue().increment(key);
        /*if (Objects.equals(type, "yyyy")) {
            //按年重置
            stringRedisTemplate.expire(key, Duration.ofDays(LocalDate.now().lengthOfYear()));
        } else if (Objects.equals(type, "yyyyMM")) {
            stringRedisTemplate.expire(key, Duration.ofDays(1L));
        } else {
            stringRedisTemplate.expire(key, Duration.ofDays(1L));
        }*/
        // 设置过期时间
        stringRedisTemplate.expire(key, Duration.ofDays(1L));
        return noPrefix + String.format("%0" + serialLength + "d", no);
    }
}
